package gui;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import aOrganizar.Asiento;
import aOrganizar.Busqueda;
import aOrganizar.Itinerario;
import aOrganizar.ItinerarioMaker;
import aOrganizar.Reserva;
import aOrganizar.ReservaManager;
import aOrganizar.Usuario;
import aOrganizar.Vuelo;
import aOrganizar.VueloHome;
import fechas.FechaUtils;


/**
 * Application Model para la busqueda de Asientos
 * @author martin
 *
 */
@Observable
public class BuscadorAsientos {
	private Usuario usuario;
	private String origen;
	private String destino;
	private String fecha;
	private List<Itinerario> resultados;
	private Itinerario itinerarioSeleccionado;
	private Busqueda busqueda;
	private ReservaManager reserva;


	// ********************************************************
	// ** Acciones
	// ********************************************************

	public BuscadorAsientos(Usuario usuario2) {
		this.usuario = usuario2;
		this.origen = "";
		this.destino = "";
		this.fecha = "";
		this.reserva  = ReservaManager.getInstance();
	}
	
	public void search() {
		this.validar();
		this.busqueda = new Busqueda(StringUtils.upperCase(this.destino),StringUtils.upperCase(this.origen), FechaUtils.stringToDateLatinoReducido(fecha),0);
		this.resultados = (List<Itinerario>) ItinerarioMaker.getInstance().armarItinerario(this.busqueda, this.usuario);
	}

	public void clear() {
		this.origen = "";
		this.destino = "";
		this.fecha = "";
		this.resultados=null;
	}
	
	public boolean reservar()
	{
		//Obtengo el asiento.
		Asiento  asiento = this.itinerarioSeleccionado.getAsientos().get(0);

		//Obtengo la fecha
		Date fechatmp = asiento.getVuelo().getSalida();
				
		//Obtengo el vuelo
		Vuelo vuelo   = VueloHome.getVuelo(fechatmp, fechatmp, asiento.getVuelo().getCodigo(),asiento.getVuelo().getAerolinea());
	
		//Obtengo el asiento
		Asiento asiento2 = new Asiento(asiento.getClase(),asiento.getNumeroDeAsiento(),asiento.getPrecio(), asiento.getUbicacion(),vuelo,asiento.getEstado(),this.usuario);
				
		//Reviso si ya fue reservado.
		Reserva resu = reserva.buscar_reserva(new Reserva(asiento2,this.usuario,false));
						
		//Si es nulo significa que no esta.
		if (resu==null)
		{		
			//Hace la reserva y me devuelve true q se pudo hacer.
			reserva.reservar(asiento2,this.usuario);
						
			//Devuelvo verdadero.
			return true;
		}
		else
		{
			//Devuelvo falso cuando ya esta reservado y no tengo permiso para sobrereservar.
			return false;
		}
		
	}	

	// ********************************************************
	// ** Accessors
	// ********************************************************

	
	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.validarFecha(fecha);
		this.fecha = fecha;
	}

	public List<Itinerario> getResultados() {
		return resultados;
	}

	public void setResultados(List<Itinerario> resultados) {
		this.resultados = resultados;
	}

	public Itinerario getItinerarioSeleccionado() {
		return itinerarioSeleccionado;
	}

	public void setItinerarioSeleccionado(Itinerario itinerarioSeleccionado) {
		this.itinerarioSeleccionado = itinerarioSeleccionado;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public Busqueda getBusqueda() {
		return busqueda;
	}

	public void setBusqueda(Busqueda busqueda) {
		this.busqueda = busqueda;
	}

	//**** Validators**//
	
	public void validarFecha(String fecha){
		if(!FechaUtils.isFechaLatino(fecha))
			throw new UserException("Debe Ingresar una fecha valida dd/MM/aa");
	}
	
	public void validar(){
		if(this.fecha.isEmpty() || this.origen.isEmpty() || this.destino.isEmpty())
			throw new UserException("Debe Ingresar todos los campos de bùsqueda");
	}
	
	

}
